package com.example.springboottest.example.refrect;

import com.example.springboottest.example.dynamicproxy.HelloService;

import java.lang.reflect.Method;

/**
 * 反射是一种技术实现方式
 * 代理提现的是一种设计模式，使用到的技术是反射
 * <p>
 * 一般对象是通过new出来的，然后通过对象主动调用方法或者设置属性值
 * 反射则不同，它通过类加载器 去加载某个类或者某个类的全限定名称
 * 加载完成后，仅仅只有这个类的clsss对称，没有实例对象，实例对象需要通过newInstance构造出来
 * 然后通过class对象获取到里面的方法或属性，通过方法或属性调用反向调用
 *
 * spring框架通过反射机制，从xml、注解等方式获取到类对象，完成对象的组装和实例
 */
public class RefrectTest {
    public static void main(String[] args) {
        try {
            //第一种方式
//            Class helloServiceClass = HelloService.class;
            //第二种方式，只需要class全限定名
            Class helloServiceClass = Class.forName("com.example.springboottest.example.dynamicproxy.HelloService");
            Method sayHelloMethod = helloServiceClass.getMethod("sayHello", String.class);
            Object obj = helloServiceClass.getConstructor().newInstance();

            String mess = (String) sayHelloMethod.invoke(obj, "张三");
            System.out.println(mess);

            HelloService helloService = (HelloService) helloServiceClass.getConstructor().newInstance();
            helloService.sayHello("李四");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
